با بهترین شیوهها برای گردش کار، ابزارها و کیفیت کد، بر توسعه مدرن جاوا اسکریپت مسلط شوید. همکاری و کارایی را در تیمهای بینالمللی افزایش دهید.
بهترین شیوهها در توسعه جاوا اسکریپت: پیادهسازی گردش کار مدرن
جاوا اسکریپت از یک زبان اسکریپتنویسی ساده به یک قدرت برای ساخت اپلیکیشنهای وب پیچیده، اپلیکیشنهای موبایل و حتی راهحلهای سمت سرور تبدیل شده است. این تحول، اتخاذ بهترین شیوههای توسعه مدرن را برای تضمین کیفیت کد، قابلیت نگهداری و مقیاسپذیری، به ویژه در تیمهای توزیعشده جهانی، ضروری میسازد. این راهنمای جامع به بررسی جنبههای کلیدی پیادهسازی گردش کار مدرن جاوا اسکریپت میپردازد و بینشهای عملی برای توسعهدهندگان در تمام سطوح ارائه میدهد.
۱. پذیرش استانداردهای مدرن ECMAScript
اکما اسکریپت (ES) مشخصات استاندارد شده برای جاوا اسکریپت است. بهروز بودن با آخرین نسخههای ES برای بهرهگیری از ویژگیها و بهبودهای جدید بسیار مهم است. دلایل آن در ادامه آمده است:
- سینتکس بهبود یافته: ES6 (ES2015) ویژگیهایی مانند توابع پیکانی (arrow functions)، کلاسها، لیترالهای قالب (template literals) و تخریب ساختار (destructuring) را معرفی کرد که کد را مختصرتر و خواناتر میکند.
- کارایی پیشرفته: نسخههای بعدی ES ویژگیهایی مانند async/await برای برنامهنویسی ناهمزمان، زنجیرهسازی اختیاری (optional chaining) و عملگر الحاق پوچ (nullish coalescing operator) را اضافه کردند.
- بهینهسازیهای عملکرد: موتورهای مدرن جاوا اسکریپت برای ویژگیهای جدیدتر ES بهینه شدهاند که منجر به عملکرد بهتر میشود.
۱.۱. ترنسپایل کردن با Babel
در حالی که مرورگرهای مدرن از اکثر ویژگیهای ES پشتیبانی میکنند، مرورگرهای قدیمیتر ممکن است این کار را نکنند. Babel یک ترنسپایلر (transpiler) جاوا اسکریپت است که کد مدرن جاوا اسکریپت را به نسخهای سازگار با نسخههای قدیمیتر تبدیل میکند که میتواند در محیطهای قدیمیتر اجرا شود. این ابزار برای تضمین سازگاری بین مرورگرها بسیار حیاتی است.
مثال پیکربندی Babel (.babelrc یا babel.config.js):
module.exports = {
presets: [
['@babel/preset-env', {
targets: {
browsers: ['> 0.25%', 'not dead']
}
}]
]
};
این پیکربندی مرورگرهایی با بیش از ۰.۲۵٪ سهم بازار را هدف قرار میدهد و مرورگرهای مرده (مرورگرهایی که دیگر پشتیبانی نمیشوند) را مستثنی میکند.
۱.۲. استفاده از ماژولهای ES
ماژولهای ES (import و export) روشی استاندارد برای سازماندهی و اشتراکگذاری کد فراهم میکنند. آنها چندین مزیت نسبت به ماژولهای سنتی CommonJS (require) دارند:
- تحلیل استاتیک: ماژولهای ES میتوانند به صورت استاتیک تحلیل شوند که امکان tree shaking (حذف کد استفاده نشده) و بهینهسازیهای دیگر را فراهم میکند.
- بارگذاری ناهمزمان: ماژولهای ES میتوانند به صورت ناهمزمان بارگذاری شوند که عملکرد بارگذاری صفحه را بهبود میبخشد.
- خوانایی بهبود یافته: سینتکس
importوexportبه طور کلی خواناتر ازrequireدر نظر گرفته میشود.
مثال ماژول ES:
// my-module.js
export function greet(name) {
return `سلام، ${name}!`;
}
// app.js
import { greet } from './my-module.js';
console.log(greet('دنیا')); // خروجی: سلام، دنیا!
۲. اتخاذ معماری ماژولار
معماری ماژولار یک اصل طراحی است که شامل شکستن یک اپلیکیشن بزرگ به ماژولهای کوچکتر و مستقل است. این رویکرد چندین مزیت دارد:
- سازماندهی بهتر کد: ماژولها کدهای مرتبط را کپسوله میکنند که درک و نگهداری آنها را آسانتر میسازد.
- قابلیت استفاده مجدد بیشتر: ماژولها میتوانند در بخشهای مختلف اپلیکیشن یا در پروژههای دیگر دوباره استفاده شوند.
- تستپذیری بهتر: ماژولها میتوانند به طور مستقل تست شوند که شناسایی و رفع باگها را آسانتر میکند.
- همکاری بهتر: تیمها میتوانند به طور همزمان روی ماژولهای مختلف کار کنند بدون اینکه در کار یکدیگر تداخل ایجاد کنند.
۲.۱. معماری مبتنی بر کامپوننت (برای فرانتاند)
در توسعه فرانتاند، معماری مبتنی بر کامپوننت یک رویکرد محبوب برای ماژولار بودن است. فریمورکهایی مانند React، Angular و Vue.js بر اساس مفهوم کامپوننتها ساخته شدهاند.
مثال (React):
import React from 'react';
function Greeting(props) {
return <h1>سلام، {props.name}!</h1>;
}
export default Greeting;
۲.۲. معماری میکروسرویسها (برای بکاند)
در توسعه بکاند، معماری میکروسرویسها یک رویکرد ماژولار است که در آن اپلیکیشن از سرویسهای کوچک و مستقلی تشکیل شده است که از طریق شبکه با یکدیگر ارتباط برقرار میکنند. این معماری به ویژه برای اپلیکیشنهای بزرگ و پیچیده مناسب است.
۳. انتخاب فریمورک یا کتابخانه مناسب
جاوا اسکریپت طیف گستردهای از فریمورکها و کتابخانهها را برای اهداف مختلف ارائه میدهد. انتخاب ابزار مناسب برای کار، برای به حداکثر رساندن بهرهوری و تضمین موفقیت پروژه شما بسیار مهم است. در اینجا چند گزینه محبوب آورده شده است:
- React: یک کتابخانه جاوا اسکریپت اعلانی برای ساخت رابطهای کاربری. به خاطر معماری مبتنی بر کامپوننت و DOM مجازی شناخته شده است. به طور گسترده در سطح جهانی توسط شرکتهایی مانند فیسبوک، اینستاگرام و نتفلیکس استفاده میشود.
- Angular: یک فریمورک جامع برای ساخت اپلیکیشنهای وب پیچیده. Angular که توسط گوگل توسعه یافته است، یک رویکرد ساختاریافته برای توسعه با ویژگیهایی مانند تزریق وابستگی (dependency injection) و پشتیبانی از TypeScript فراهم میکند. شرکتهایی مانند گوگل، مایکروسافت و فوربز از Angular استفاده میکنند.
- Vue.js: یک فریمورک پیشرونده برای ساخت رابطهای کاربری. Vue.js به خاطر سادگی و سهولت استفاده شناخته شده است که آن را به گزینهای خوب برای پروژههای کوچک و بزرگ تبدیل میکند. علیبابا، شیائومی و گیتلب از Vue.js استفاده میکنند.
- Node.js: یک محیط اجرای جاوا اسکریپت که به شما امکان میدهد کد جاوا اسکریپت را در سمت سرور اجرا کنید. Node.js اغلب برای ساخت APIها، اپلیکیشنهای بلادرنگ و ابزارهای خط فرمان استفاده میشود. نتفلیکس، لینکدین و اوبر از کاربران اصلی Node.js هستند.
- Express.js: یک فریمورک اپلیکیشن وب مینیمالیستی برای Node.js. Express.js روشی ساده و انعطافپذیر برای ساخت وب سرورها و APIها فراهم میکند.
ملاحظات هنگام انتخاب فریمورک/کتابخانه:
- نیازمندیهای پروژه: نیازهای خاص پروژه شما چیست؟
- تخصص تیم: تیم شما با کدام فریمورکها/کتابخانهها از قبل آشنا است؟
- پشتیبانی جامعه: آیا جامعه بزرگ و فعالی برای آن فریمورک/کتابخانه وجود دارد؟
- عملکرد: عملکرد فریمورک/کتابخانه تحت شرایط مختلف چگونه است؟
- مقیاسپذیری: آیا فریمورک/کتابخانه میتواند رشد مورد انتظار اپلیکیشن شما را مدیریت کند؟
۴. نوشتن کد تمیز و قابل نگهداری
کد تمیز، کدی است که خواندن، درک و نگهداری آن آسان باشد. نوشتن کد تمیز برای موفقیت بلندمدت پروژه ضروری است، به خصوص هنگام کار در تیم.
۴.۱. پیروی از قراردادهای کدنویسی
قراردادهای کدنویسی مجموعهای از قوانین هستند که نحوه نوشتن کد را دیکته میکنند. قراردادهای کدنویسی منسجم، خوانایی کد را بهبود بخشیده و همکاری با سایر توسعهدهندگان را آسانتر میکند. نمونههایی از قراردادهای رایج کدنویسی جاوا اسکریپت عبارتند از:
- قراردادهای نامگذاری: از نامهای توصیفی و منسجم برای متغیرها، توابع و کلاسها استفاده کنید. برای مثال، از
camelCaseبرای متغیرها و توابع (مانندfirstName،calculateTotal) و ازPascalCaseبرای کلاسها (مانندUserAccount) استفاده کنید. - تورفتگی (Indentation): از تورفتگی منسجم (مانند ۲ فاصله یا ۴ فاصله) برای بهبود خوانایی کد استفاده کنید.
- کامنتها: برای توضیح کدهای پیچیده یا غیر بدیهی، کامنتهای واضح و مختصر بنویسید. کامنتها را با تغییرات کد بهروز نگه دارید.
- طول خط: طول خط را به تعداد معقولی از کاراکترها (مانند ۸۰ یا ۱۲۰) محدود کنید تا از اسکرول افقی جلوگیری شود.
۴.۲. استفاده از یک لینتر (Linter)
لینتر ابزاری است که به طور خودکار کد شما را برای نقض سبک و خطاهای احتمالی بررسی میکند. لینترها میتوانند به شما در اجرای قراردادهای کدنویسی و شناسایی باگها در مراحل اولیه فرآیند توسعه کمک کنند. ESLint یک لینتر محبوب جاوا اسکریپت است.
مثال پیکربندی ESLint (.eslintrc.js):
module.exports = {
env: {
browser: true,
es2021: true,
node: true
},
extends: [
'eslint:recommended',
'plugin:react/recommended'
],
parserOptions: {
ecmaFeatures: {
jsx: true
},
ecmaVersion: 12,
sourceType: 'module'
},
plugins: [
'react'
],
rules: {
'no-unused-vars': 'warn',
'react/prop-types': 'off'
}
};
۴.۳. بازبینی کد (Code Reviews)
بازبینی کد شامل این است که سایر توسعهدهندگان کد شما را قبل از ادغام در کدبیس اصلی بازبینی کنند. بازبینی کد میتواند به شما در شناسایی باگها، تشخیص مشکلات احتمالی و بهبود کیفیت کد کمک کند. همچنین فرصتی برای به اشتراکگذاری دانش و راهنمایی فراهم میکند.
۵. نوشتن تستهای مؤثر
تست بخش ضروری فرآیند توسعه نرمافزار است. نوشتن تستهای مؤثر میتواند به شما کمک کند تا اطمینان حاصل کنید که کد شما همانطور که انتظار میرود کار میکند و از رگرسیون (regression) جلوگیری میکند. انواع مختلفی از تستها وجود دارد:
- تستهای واحد (Unit Tests): تست واحدهای جداگانه کد (مانند توابع، کلاسها) به صورت مجزا.
- تستهای یکپارچهسازی (Integration Tests): تست نحوه تعامل واحدهای مختلف کد با یکدیگر.
- تستهای سرتاسری (End-to-End Tests): تست کل اپلیکیشن از دیدگاه کاربر.
۵.۱. انتخاب یک فریمورک تست
چندین فریمورک تست جاوا اسکریپت موجود است. برخی از گزینههای محبوب عبارتند از:
- Jest: یک فریمورک تست محبوب که توسط فیسبوک توسعه یافته است. Jest به خاطر سهولت استفاده و ویژگیهای داخلی مانند mocking و پوشش کد (code coverage) شناخته شده است.
- Mocha: یک فریمورک تست انعطافپذیر که میتواند با کتابخانههای مختلف assertion (مانند Chai، Assert) و کتابخانههای mocking (مانند Sinon) استفاده شود.
- Jasmine: یک فریمورک توسعه مبتنی بر رفتار (BDD) که سینتکس تمیز و خوانایی برای نوشتن تستها فراهم میکند.
۵.۲. توسعه آزمونمحور (TDD)
توسعه آزمونمحور (TDD) یک فرآیند توسعه است که در آن شما قبل از نوشتن کدی که عملکرد را پیادهسازی میکند، تستها را مینویسید. این رویکرد میتواند به شما کمک کند تا اطمینان حاصل کنید که کد شما نیازمندیها را برآورده میکند و از مهندسی بیش از حد (over-engineering) جلوگیری میکند.
۶. خودکارسازی گردش کار با CI/CD
یکپارچهسازی مداوم/استقرار مداوم (CI/CD) مجموعهای از شیوههاست که فرآیند توسعه نرمافزار را از یکپارچهسازی کد تا استقرار، خودکار میکند. CI/CD میتواند به شما در کاهش خطر خطاها، بهبود کیفیت کد و تسریع چرخه انتشار کمک کند.
۶.۱. راهاندازی یک پایپلاین CI/CD
یک پایپلاین CI/CD معمولاً شامل مراحل زیر است:
- یکپارچهسازی کد: توسعهدهندگان کد خود را در یک مخزن مشترک (مانند Git) ادغام میکنند.
- ساخت (Build): سیستم CI/CD به طور خودکار اپلیکیشن را میسازد.
- تست: سیستم CI/CD به طور خودکار تستها را اجرا میکند.
- انتشار (Release): سیستم CI/CD به طور خودکار اپلیکیشن را در یک محیط آزمایشی (staging) یا تولید (production) منتشر میکند.
۶.۲. ابزارهای محبوب CI/CD
چندین ابزار CI/CD موجود است. برخی از گزینههای محبوب عبارتند از:
- Jenkins: یک سرور اتوماسیون منبعباز که میتواند برای خودکارسازی وظایف مختلف، از جمله CI/CD، استفاده شود.
- GitHub Actions: یک سرویس CI/CD که در GitHub ادغام شده است.
- GitLab CI/CD: یک سرویس CI/CD که در GitLab ادغام شده است.
- CircleCI: یک پلتفرم CI/CD مبتنی بر ابر.
- Travis CI: یک پلتفرم CI/CD مبتنی بر ابر (عمدتاً برای پروژههای منبعباز).
۷. بهینهسازی عملکرد
عملکرد یک جنبه حیاتی برای هر اپلیکیشن وب است. بهینهسازی عملکرد میتواند تجربه کاربری را بهبود بخشد، هزینههای سرور را کاهش دهد و سئو را بهبود بخشد.
۷.۱. تقسیم کد (Code Splitting)
تقسیم کد شامل تقسیم کد شما به بستههای (bundle) کوچکتر است که میتوانند بر حسب تقاضا بارگذاری شوند. این کار میتواند زمان بارگذاری اولیه اپلیکیشن شما را کاهش داده و عملکرد را بهبود بخشد.
۷.۲. بارگذاری تنبل (Lazy Loading)
بارگذاری تنبل شامل بارگذاری منابع (مانند تصاویر، ویدئوها، ماژولها) تنها زمانی است که به آنها نیاز است. این کار میتواند زمان بارگذاری اولیه اپلیکیشن شما را کاهش داده و عملکرد را بهبود بخشد.
۷.۳. کش کردن (Caching)
کش کردن شامل ذخیره دادههایی است که به طور مکرر به آنها دسترسی پیدا میشود در یک حافظه پنهان (cache) تا بتوان به سرعت آنها را بازیابی کرد. کش کردن میتواند با کاهش تعداد درخواستها به سرور، عملکرد را به طور قابل توجهی بهبود بخشد.
- کش کردن مرورگر: هدرهای HTTP را پیکربندی کنید تا به مرورگر دستور دهد داراییهای استاتیک (مانند تصاویر، CSS، جاوا اسکریپت) را کش کند.
- کش کردن سمت سرور: از مکانیزمهای کش سمت سرور (مانند Redis، Memcached) برای کش کردن دادههایی که به طور مکرر دسترسی پیدا میکنند، استفاده کنید.
- شبکههای تحویل محتوا (CDNs): از یک CDN برای توزیع داراییهای استاتیک خود به سرورهای سراسر جهان استفاده کنید. این کار میتواند تأخیر (latency) را کاهش داده و عملکرد را برای کاربران در مکانهای جغرافیایی مختلف بهبود بخشد. نمونهها شامل Cloudflare، AWS CloudFront و Akamai هستند.
۷.۴. کوچکسازی (Minification) و فشردهسازی (Compression)
کوچکسازی شامل حذف کاراکترهای غیرضروری (مانند فضای خالی، کامنتها) از کد شما است. فشردهسازی شامل فشرده کردن کد شما برای کاهش حجم آن است. هم کوچکسازی و هم فشردهسازی میتوانند به طور قابل توجهی حجم اپلیکیشن شما را کاهش داده و عملکرد را بهبود بخشند.
۸. بینالمللیسازی (i18n) و بومیسازی (l10n)
هنگام توسعه اپلیکیشنها برای مخاطبان جهانی، در نظر گرفتن بینالمللیسازی (i18n) و بومیسازی (l10n) بسیار مهم است. i18n فرآیند طراحی و توسعه یک اپلیکیشن است به طوری که بتوان آن را با زبانها و مناطق مختلف تطبیق داد بدون اینکه نیاز به تغییرات مهندسی داشته باشد. l10n فرآیند تطبیق یک اپلیکیشن با یک زبان و منطقه خاص است.
۸.۱. استفاده از کتابخانههای i18n
چندین کتابخانه i18n جاوا اسکریپت موجود است. برخی از گزینههای محبوب عبارتند از:
- i18next: یک کتابخانه محبوب i18n که از فرمتها و ویژگیهای مختلف بومیسازی پشتیبانی میکند.
- React Intl: یک کتابخانه i18n که به طور خاص برای اپلیکیشنهای React طراحی شده است.
- Globalize.js: یک کتابخانه جامع i18n که از فرمتهای مختلف اعداد، تاریخ و ارز پشتیبانی میکند.
۸.۲. مدیریت فرمتهای تاریخ و زمان
مناطق مختلف فرمتهای تاریخ و زمان متفاوتی دارند. از کتابخانههای i18n برای فرمتبندی تاریخ و زمان مطابق با منطقه کاربر استفاده کنید.
۸.۳. مدیریت فرمتهای ارز
مناطق مختلف فرمتهای ارز متفاوتی دارند. از کتابخانههای i18n برای فرمتبندی مقادیر ارز مطابق با منطقه کاربر استفاده کنید.
۸.۴. پشتیبانی از راستبهچپ (RTL)
برخی زبانها (مانند عربی، عبری) از راست به چپ نوشته میشوند. اطمینان حاصل کنید که اپلیکیشن شما با استفاده از ویژگیهای direction در CSS و سایر تکنیکهای مناسب، از زبانهای RTL پشتیبانی میکند.
۹. بهترین شیوههای امنیتی
امنیت یک نگرانی حیاتی برای همه اپلیکیشنهای وب است. جاوا اسکریپت به ویژه در برابر انواع خاصی از حملات، مانند اسکریپتنویسی بینسایتی (XSS) و جعل درخواست بینسایتی (CSRF)، آسیبپذیر است.
۹.۱. جلوگیری از حملات XSS
حملات XSS زمانی رخ میدهد که یک مهاجم کد مخرب را به یک صفحه وب تزریق میکند که سپس توسط سایر کاربران اجرا میشود. برای جلوگیری از حملات XSS:
- پاکسازی ورودی کاربر: همیشه ورودی کاربر را قبل از نمایش آن در یک صفحه وب پاکسازی (sanitize) کنید. این کار شامل حذف یا گریز (escape) هر کاراکتری است که میتواند به عنوان کد تفسیر شود.
- استفاده از سیاست امنیتی محتوا (CSP): CSP یک مکانیزم امنیتی است که به شما امکان میدهد کنترل کنید کدام منابع (مانند اسکریپتها، شیوهنامهها، تصاویر) میتوانند توسط یک صفحه وب بارگذاری شوند.
- گریز کردن خروجی: هنگام رندر کردن دادهها در HTML، آنها را گریز (escape) کنید.
۹.۲. جلوگیری از حملات CSRF
حملات CSRF زمانی رخ میدهد که یک مهاجم یک کاربر را فریب میدهد تا بدون اطلاع یا رضایت او، اقدامی را در یک اپلیکیشن وب انجام دهد. برای جلوگیری از حملات CSRF:
- استفاده از توکنهای CSRF: توکنهای CSRF مقادیر منحصر به فرد و غیرقابل پیشبینی هستند که در درخواستها گنجانده میشوند تا تأیید کنند که درخواست از طرف کاربر است.
- استفاده از کوکیهای SameSite: کوکیهای SameSite کوکیهایی هستند که فقط به همان سایتی که آنها را تنظیم کرده است ارسال میشوند. این میتواند به جلوگیری از حملات CSRF کمک کند.
۹.۳. امنیت وابستگیها
- بازرسی منظم وابستگیها: از ابزارهایی مانند `npm audit` یا `yarn audit` برای شناسایی و رفع آسیبپذیریهای شناخته شده در وابستگیهای پروژه خود استفاده کنید.
- وابستگیها را بهروز نگه دارید: به طور منظم وابستگیهای خود را به آخرین نسخهها بهروزرسانی کنید تا آسیبپذیریهای امنیتی را برطرف کنید. استفاده از ابزارهای بهروزرسانی خودکار وابستگیها را در نظر بگیرید.
- از یک ابزار تحلیل ترکیب نرمافزار (SCA) استفاده کنید: ابزارهای SCA به طور خودکار اجزای منبعباز نرمافزار شما را شناسایی و تحلیل میکنند و خطرات امنیتی بالقوه را مشخص میکنند.
۱۰. نظارت و لاگبرداری
نظارت و لاگبرداری برای شناسایی و حل مشکلات در اپلیکیشن شما ضروری است. نظارت شامل جمعآوری و تحلیل دادهها در مورد عملکرد و سلامت اپلیکیشن شما است. لاگبرداری شامل ثبت رویدادهایی است که در اپلیکیشن شما رخ میدهد.
۱۰.۱. استفاده از یک فریمورک لاگبرداری
از یک فریمورک لاگبرداری برای ثبت رویدادها در اپلیکیشن خود استفاده کنید. برخی از فریمورکهای محبوب لاگبرداری جاوا اسکریپت عبارتند از:
- Winston: یک فریمورک لاگبرداری انعطافپذیر و قابل پیکربندی.
- Bunyan: یک فریمورک لاگبرداری مبتنی بر JSON.
- Morgan: یک میانافزار لاگبرداری درخواست HTTP برای Node.js.
۱۰.۲. استفاده از یک ابزار نظارت
از یک ابزار نظارت برای جمعآوری و تحلیل دادهها در مورد عملکرد و سلامت اپلیکیشن خود استفاده کنید. برخی از ابزارهای نظارت محبوب عبارتند از:
- New Relic: یک پلتفرم نظارت جامع برای اپلیکیشنهای وب.
- Datadog: یک پلتفرم نظارت و تحلیل برای اپلیکیشنهای ابری.
- Prometheus: یک ابزار نظارت و هشدار منبعباز.
- Sentry: یک پلتفرم ردیابی خطا و نظارت بر عملکرد.
نتیجهگیری
اتخاذ بهترین شیوههای توسعه مدرن جاوا اسکریپت برای ساخت اپلیکیشنهای با کیفیت بالا، قابل نگهداری و مقیاسپذیر، به ویژه در تیمهای توزیعشده جهانی، ضروری است. با پذیرش استانداردهای مدرن ECMAScript، اتخاذ معماری ماژولار، نوشتن کد تمیز، نوشتن تستهای مؤثر، خودکارسازی گردش کار با CI/CD، بهینهسازی عملکرد، در نظر گرفتن بینالمللیسازی و بومیسازی، پیروی از بهترین شیوههای امنیتی و پیادهسازی نظارت و لاگبرداری، میتوانید موفقیت پروژههای جاوا اسکریپت خود را به طور قابل توجهی بهبود بخشید. یادگیری و انطباق مداوم، کلید پیشرو ماندن در چشمانداز همواره در حال تحول توسعه جاوا اسکریپت است.